package com.syl.starter.itools.base.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * @author syl
 * @create 2018-09-12 17:54
 *
 *  h | verifyCode | message | comment
 *  -|-|- |-
 *  OK |200 | 操作成功 | 操作成功  幂等
 *  POST_OK | 提交成功 | 201 | 新建或修改数据成功
 *  ASYNC_OK | 202 | 提交任务成功 | 异步任务排队成功
 *  DELETE_OK | 204 | 删除成功 | 删除数据成功
 *  INVALID | 400 | 请求参数错误 | 请求发生错误 参数错误
 *  UNAUTHORIZED | 401 | 您没有访问权限 | 无权限(令牌、用户名、密码错误)
 *  FORBIDDEN | 403 | 您没有访问权限 | 无权限(已登录操作被禁止)
 *  NOT_FOUND | 404 | 找不到页面 | 找不到页面
 *  NOT_ACCEPTABLE | 406 | 请求格式错误 | 请求格式错误
 *  GONE | 410 | 找不到请求资源 | 资源已删除
 *  VERIFY_ERROR | 参数未通过验证 |422 | 请求参数验证不通过
 *  SERVER_ERROR | 500 | 服务器开小差了 | 服务器发生错误
 *  GATEWAY_ERROR | 502 | 网关错误 | 网关错误
 *  DEATH | 503 | 服务暂不可用 | 服务不可用
 *  TIMEOUT | 504 | 请求超时 | 网关超时接口超时
 **/
@Getter
@AllArgsConstructor
public enum ResponseCodeEnum {
    /**
     * 200 操作成功幂等
     */
    OK(200, "操作成功", "操作成功幂等"),
    /**
     * 201 新建或修改数据成功
     */
    POST_OK(201, "提交成功", "新建或修改数据成功"),
    /**
     * 202 异步任务排队成功
     */
    ASYNC_OK(202, "提交任务成功", "异步任务排队成功"),
    /**
     * 204 删除数据成功
     */
    DELETE_OK(204, "删除成功", "删除数据成功"),
    /**
     * 400 请求发生错误参数错误
     */
    INVALID(400, "请求参数错误", "请求发生错误参数错误"),
    /**
     * 401 无权限(令牌、用户名、密码错误)
     */
    UNAUTHORIZED(401, "您还未登录", "无权限(令牌、用户名、密码错误)"),
    /**
     * 403 无权限(已登录操作被禁止)
     */
    FORBIDDEN(403, "您没有访问权限", "无权限或操作被禁止 例如请求频繁"),
    /**
     * 404 找不到页面
     */
    NOT_FOUND(404, "找不到页面", "找不到页面"),
    /**
     * 406 请求格式错误
     */
    NOT_ACCEPTABLE(406, "请求格式错误", "请求格式错误"),
    /**
     * 410 资源已删除 找不到请求资源
     */
    GONE(410, "找不到请求资源", "资源已删除 找不到请求资源"),
    /**
     * 422 请求参数验证不通过
     */
    VERIFY_ERROR(422, "参数未通过验证", "请求参数验证不通过"),
    /**
     * 500 服务器发生错误
     */
    SERVER_ERROR(500, "服务器开小差了", "服务器发生错误"),
    /**
     * 502 网关错误
     */
    GATEWAY_ERROR(502, "网关错误", "网关错误"),
    /**
     * 503 服务不可用
     */
    DEATH(503, "服务暂不可用", "服务不可用"),
    /**
     * 504 网关超时接口超时
     */
    TIMEOUT(504, "请求超时", "网关超时接口超时"),
    /**
     * 506 未通过业务验证时的状态
     */
    BIZ(506, "业务禁止操作", ""),
    NULL(null, null, null);

    private Integer code;
    private String message;
    private String description;

    public static ResponseCodeEnum getEnumByCode(Integer code) {
        ResponseCodeEnum[] values = ResponseCodeEnum.values();
        for (ResponseCodeEnum em : values) {
            Integer emCode = em.getCode();
            if (emCode == null) continue;
            if (emCode.equals(code)) return em;
        }
        return NULL;
    }

    public static ResponseCodeEnum getEnumByMessage(String message) {
        ResponseCodeEnum[] values = ResponseCodeEnum.values();
        for (ResponseCodeEnum em : values) {
            String emMessage = em.getMessage();
            if (emMessage == null) continue;
            if (emMessage.equals(message)) return em;
        }
        return NULL;
    }

    public static ResponseCodeEnum getEnumByDescription(String description) {
        ResponseCodeEnum[] values = ResponseCodeEnum.values();
        for (ResponseCodeEnum em : values) {
            String emDescription = em.getDescription();
            if (emDescription == null) continue;
            if (emDescription.equals(description)) return em;
        }
        return NULL;
    }

    public Integer getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    public String getDescription() {
        return description;
    }
}
